#include "mainwidget.h"
#include "ui_mainwidget.h"

#include <QIcon>
#include <QFile>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>

#include "selfinfowidget.h"
#include "sessiondetailwidget.h"
#include "groupsessiondetailwidget.h"
#include "addfrienddialog.h"
#include "debug.h"

//单例模式
MainWidget* MainWidget::instance = nullptr;

MainWidget *MainWidget::getInstance()
{
    if(instance == nullptr)
    {
        // 此处不传入参数, 以桌面为父窗口.
        // 由于此处的窗口是整个程序的主窗口, 父窗口就设定为桌面, 本身就是常规设定.
        instance = new MainWidget();
    }
    return instance;
}

//构造函数
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);

    this->setWindowTitle("我的聊天室");
    this->setWindowIcon(QIcon(":/resource/image/logo.png"));

    // 初始化主窗口的样式布局
    initMainWindow();
    // 初始化左侧窗口布局
    initLeftWindow();
    // 初始化中间窗口布局
    initMidWindow();
    // 初始化右侧窗口布局
    initRightWindow();
    // 初始化信号槽
    initSignalSlot();

}

void MainWidget::initMainWindow()
{
    QHBoxLayout* layout = new QHBoxLayout();
    // Spacing 就是 layout 内部元素之间的间隔距离. 设为 0 就是 "紧挨着"
    layout->setSpacing(0);
    // layout 里面的元素距离四个边界的距离.
    layout->setContentsMargins(0,0,0,0);
    this->setLayout(layout);

    // 三个子模块，左、中、右
    windowleft = new QWidget();
    windowmid = new QWidget();
    windowright = new QWidget();

    windowleft->setFixedWidth(60);
    windowmid->setFixedWidth(300);
    windowright->setMinimumWidth(600);

    windowleft->setStyleSheet("QWidget { background-color: rgb(46, 46, 46); }");
    windowmid->setStyleSheet("QWidget { background-color: rgb(247, 247, 247); }");
    windowright->setStyleSheet("QWidget { background-color: rgb(225, 225, 225); }");

    layout->addWidget(windowleft);
    layout->addWidget(windowmid);
    layout->addWidget(windowright);
}

void MainWidget::initLeftWindow()
{
    QVBoxLayout* layout = new QVBoxLayout();
    layout->setSpacing(10);
    layout->setContentsMargins(0,30,0,0);
    windowleft->setLayout(layout);

    // 头像按钮
    userAvatar = new QPushButton();
    userAvatar->setFixedSize(30,30);
    userAvatar->setIconSize(QSize(30,30));
    userAvatar->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
    userAvatar->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(userAvatar,1,Qt::AlignTop | Qt::AlignHCenter);

    // 聊天列表
    sessionTabBtn = new QPushButton();
    sessionTabBtn->setFixedSize(30,30);
    sessionTabBtn->setIconSize(QSize(30,30));
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    sessionTabBtn->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(sessionTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    // 好友列表
    friendTabBtn = new QPushButton();
    friendTabBtn->setFixedSize(30,30);
    friendTabBtn->setIconSize(QSize(30,30));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    friendTabBtn->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(friendTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    // 好友添加
    applyTabBtn = new QPushButton();
    applyTabBtn->setFixedSize(30,30);
    applyTabBtn->setIconSize(QSize(30,30));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    applyTabBtn->setStyleSheet("QPushButton { background-color: transparent; }");
    layout->addWidget(applyTabBtn,1,Qt::AlignTop | Qt::AlignHCenter);

    layout->addStretch(20);     //弹簧
}

void MainWidget::initMidWindow()
{
    QGridLayout* layout = new QGridLayout();
    // 距离上方有 10px 的距离, 另外三个方向都不要边距
    layout->setContentsMargins(0,10,0,0);
    layout->setHorizontalSpacing(0);
    layout->setVerticalSpacing(10);
    windowmid->setLayout(layout);

    // 搜索框
    searchEdit = new QLineEdit();
    searchEdit->setFixedHeight(30);
    searchEdit->setPlaceholderText("搜索");
    searchEdit->setStyleSheet("QLineEdit { border-radius: 5px; background-color: rgb(226, 226, 226); padding-left: 5px;}");

    // 好友添加按钮
    addFriend = new QPushButton();
    addFriend->setFixedSize(30,30);
    addFriend->setIcon(QIcon(":/resource/image/cross.png"));
    QString style = "QPushButton { border-radius: 5px; background-color: rgb(226, 226, 226); }";
    style += " QPushButton:pressed { background-color: rgb(240, 240, 240); }";
    addFriend->setStyleSheet(style);

    // 列表区域
    sessionFriendarea = new sessionFriendArea();

    // 为了更灵活的控制边距, 只影响搜索框按钮这一行, 不影响下方列表这一行
    // 创建空白的 widget 填充到布局管理器中.
    QWidget* spacer1 = new QWidget();
    QWidget* spacer2 = new QWidget();
    QWidget* spacer3 = new QWidget();
    spacer1->setFixedWidth(10);
    spacer2->setFixedWidth(10);
    spacer3->setFixedWidth(10);

    layout->addWidget(spacer1,0,0);
    layout->addWidget(searchEdit,0,1);
    layout->addWidget(spacer2,0,2);
    layout->addWidget(addFriend,0,3);
    layout->addWidget(spacer3,0,4);
    layout->addWidget(sessionFriendarea,1,0,1,5);   //后两位参数表示占据1行5列

}

void MainWidget::initRightWindow()
{
    // 1. 创建右侧窗口的布局管理器
    QVBoxLayout* vlayout = new QVBoxLayout();
    vlayout->setSpacing(0);
    vlayout->setContentsMargins(0,0,0,0);
    vlayout->setAlignment(Qt::AlignTop);
    windowright->setLayout(vlayout);

    // 2. 创建上方标题栏
    QWidget* titleWidget = new QWidget();
    titleWidget->setFixedHeight(50);
    titleWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
    titleWidget->setObjectName("titleWidget");
    titleWidget->setStyleSheet("#titleWidget { border-bottom: 1px solid rgb(230, 230, 230); border-left: 1px solid rgb(236, 236, 236); }");
    vlayout->addWidget(titleWidget);

    // 3. 给标题栏, 添加标题 label 和 一个按钮
    QHBoxLayout* hlayout = new QHBoxLayout();
    hlayout->setSpacing(0);
    // 使标题的 label 和 按钮距离左右两侧的边界, 有点间距.
    hlayout->setContentsMargins(10,0,10,0);
    titleWidget->setLayout(hlayout);

    sessionTitleLabel = new QLabel();
    sessionTitleLabel->setStyleSheet("QLabel { font-size: 22px; border-bottom: 1px solid rgb(230, 230, 230);}");
#ifdef TEST_UI
    // 为了测试界面临时增加的. 实际这里的内容, 应该是使用从服务器获取的数据来设置.
    sessionTitleLabel->setText("这是会话标题");
#endif
    hlayout->addWidget(sessionTitleLabel);

    extraBtn = new QPushButton();
    extraBtn->setFixedSize(30,30);
    extraBtn->setIconSize(QSize(30,30));
    extraBtn->setIcon(QIcon(":/resource/image/more.png"));
    extraBtn->setStyleSheet("QPushButton { border:none; background-color: rgb(225, 225, 225); } QPushButton:pressed { background-color: rgb(220, 220, 220); }");
    hlayout->addWidget(extraBtn);

    // 4. 添加消息展示区
    msgShowArea = new MessageShowArea();
    vlayout->addWidget(msgShowArea);

    // 5. 添加消息编辑区
    msgEditArea = new MessageEditArea();
    // 确保消息编辑区, 处于窗口的下方.
    vlayout->addWidget(msgEditArea,0,Qt::AlignBottom);

}

void MainWidget::initSignalSlot()
{
    /************************
     * 连接信号槽, 处理标签页按钮切换的问题
     ***********************/

    connect(sessionTabBtn,&QPushButton::clicked,this,&MainWidget::switchTabToSession);
    connect(friendTabBtn,&QPushButton::clicked,this,&MainWidget::switchTabToFriend);
    connect(applyTabBtn,&QPushButton::clicked,this,&MainWidget::switchTabToApply);

    // 点击头像弹出个人信息
    connect(userAvatar,&QPushButton::clicked,this,[=](){
        selfInfoWidget* selfInfo = new selfInfoWidget(this);
        // selfInfo->exec();
        selfInfo->show();
    });

    // 点击添加好友弹出窗口
    connect(addFriend,&QPushButton::clicked,this,[=](){
        AddFriendDialog* addFriendDialog = new AddFriendDialog(this);
        addFriendDialog->show();
    });

    // 点击会话详情
    connect(extraBtn,&QPushButton::clicked,this,[=](){
        // 目前测试
    // 判定当前会话是单聊还是群聊.
    // 这个 bool 变量, 要根据当前选中的实际会话来确定. (后续接入服务器, 获取真实数据之后)
#if TEST_GROUP_SESSION
        bool isSingleChat = false;
#else
        bool isSingleChat = true;
#endif

#ifdef TEST_UI
        UserInfo userInfo;
        userInfo.userId = QString::number(100);
        userInfo.nickname = "小短腿";
        userInfo.description = "我是大帅哥";
        userInfo.phone = "15019735211";
        userInfo.avatar = QIcon(":/resource/image/defaultAvatar.png");
#endif

        if(isSingleChat)
        {
            sessionDetailWidget* sessiondetailWidget = new sessionDetailWidget(this,userInfo);
            sessiondetailWidget->show();
        }
        else
        {
            GroupsessionDetailWidget* gssdw = new GroupsessionDetailWidget(this);
            gssdw->show();
        }

    });

}

void MainWidget::switchTabToSession()
{
    //通过activeTab来标识选中,后续判断也容易
    activeTab = SESSION_LIST;
    //选择到之后把图片切换成被选中的图片就行
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    //同时列表的对应功能也得刷新
    this->loadSessionList();
    //TODO
}

void MainWidget::switchTabToFriend()
{
    //通过activeTab来标识选中
    activeTab = FRIEND_LIST;
    //选择到之后把图片切换成被选中的图片就行
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
    //同时列表的对应功能也得刷新
    this->loadFriendList();
    //TODO
}

void MainWidget::switchTabToApply()
{
    //通过activeTab来标识选中
    activeTab = APPLY_LIST;
    //选择到之后把图片切换成被选中的图片就行
    sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
    friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
    applyTabBtn->setIcon(QIcon(":/resource/image/apply_active.png"));
    //同时列表的对应功能也得刷新
    this->loadApplyList();
    //TODO
}

void MainWidget::loadSessionList()
{

}

void MainWidget::loadFriendList()
{

}

void MainWidget::loadApplyList()
{

}

//析构函数
MainWidget::~MainWidget()
{
    delete ui;
}
